package com.app.sgd.business.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Date;

import javax.sql.DataSource;

import org.apache.log4j.Logger;

import com.app.sgd.model.bean.Documento;
import com.app.sgd.model.bean.ExpedienteSTDBean;
import com.app.sgd.plugin.JNDIConnector;
import com.app.sgd.util.Constants;
import com.app.sgd.view.vo.FiltroBusquedaVO;
import com.app.sgd.view.vo.RespuestaVO;

public class SQLExpedienteSTDDAO {
	private static Logger logger = Logger.getLogger(SQLExpedienteSTDDAO.class);
	
	DataSource ds = null;
	JNDIConnector cn = new JNDIConnector();
	
	public RespuestaVO grabarExpediente(ExpedienteSTDBean bean) throws Exception {
		RespuestaVO respuestaVO = new RespuestaVO();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		
		try{
			conn = cn.connect().getConnection();
			
	    	String vSQL = "{call std_sp_grabar_expediente(?,?,?,?,?,?,?,?,?,?,?)}";
	    	call = conn.prepareCall(vSQL);
	    	call.setInt(1,bean.getAccion());
	    	call.setLong(2,bean.getCodigoExpediente());
	    	call.setInt(3,Integer.parseInt(bean.getCodigoEstado()));
	    	call.setString(4,bean.getAsuntoExpediente());
	    	call.setString(5,bean.getFechaExpediente());
	    	call.setString(6,bean.getCodigoOficina());
	    	call.setString(7,bean.getUsuario().getCodigoEmpleado());
	    	call.setString(8,bean.getUsuario().getCodigo());
	    	call.setString(9,bean.getUsuario().getNombre());
	    	call.registerOutParameter(10, Types.NUMERIC);
	    	call.registerOutParameter(11, Types.VARCHAR);
	    	
	    	int res = call.executeUpdate();
	    	
	    	Long codigoExpediente = call.getLong(10);
	    	System.out.println("codigoExpediente = "+codigoExpediente);
	    	
	    	String numeroExpediente = call.getString(11);
	    	
	    	respuestaVO.setCodigoExpediente(codigoExpediente);
	    	respuestaVO.setNumeroExpediente(numeroExpediente);
	    	
		}catch(Exception e){
			logger.error("[STD]: Error en grabarExpediente: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		
		return respuestaVO;
	}

	public ArrayList<ExpedienteSTDBean> listarExpedientes(
			FiltroBusquedaVO filtroBusquedaVO) throws Exception{
		ArrayList<ExpedienteSTDBean> lstExpedientes = new ArrayList<ExpedienteSTDBean>();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null; 
		ResultSet rs = null;
	    try{
	    	conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_get_listado_expedientes(?,?,?,?,?,?,?,?,?,?,?,?)}";
	    	
	    	call = conn.prepareCall(vSQL);    	
	    	call.setString(1, filtroBusquedaVO.getTipoBusqueda());
	    	call.setString(2, filtroBusquedaVO.getNumeroExpediente());
            call.setString(3, filtroBusquedaVO.getFechaInicio());
            call.setString(4, filtroBusquedaVO.getFechaFin());
            call.setInt(5, Integer.parseInt(filtroBusquedaVO.getCodOficina()));
            call.setInt(6, Integer.parseInt(filtroBusquedaVO.getCodEstado()));
            call.setString(7, filtroBusquedaVO.getTipoBandejaBusqueda());
            call.setInt(8, Integer.parseInt(filtroBusquedaVO.getUsuario().getEncargaturaPerfil().getCodPerfil()));
            call.setInt(9, Integer.parseInt(filtroBusquedaVO.getUsuario().getCodigoEmpleado()));
            call.setInt(10,Integer.parseInt(filtroBusquedaVO.getUsuario().getEncargaturaPerfil().getCodArea()));
        	call.setInt(11,Integer.parseInt(filtroBusquedaVO.getUsuario().getCodigo()));
        	call.setInt(12,Integer.parseInt(filtroBusquedaVO.getUsuario().getEncargaturaPerfil().getCodEncargatura()));
        	
        	System.out.println("tipoBusqueda="+filtroBusquedaVO.getTipoBusqueda());
        	System.out.println("numeroExpediente="+filtroBusquedaVO.getNumeroExpediente());
        	System.out.println("getFechaInicio="+filtroBusquedaVO.getFechaInicio());
        	System.out.println("getFechaFin="+filtroBusquedaVO.getFechaFin());
        	System.out.println("getCodOficina="+filtroBusquedaVO.getCodOficina());
        	System.out.println("getCodEstado="+filtroBusquedaVO.getCodEstado());
        	System.out.println("getUsuario().getEncargaturaPerfil().getCodPerfil()="+filtroBusquedaVO.getUsuario().getEncargaturaPerfil().getCodPerfil());
        	System.out.println("getUsuario().getCodigoEmpleado()="+filtroBusquedaVO.getUsuario().getCodigoEmpleado());
        	System.out.println("getUsuario().getEncargaturaPerfil().getCodArea="+filtroBusquedaVO.getUsuario().getEncargaturaPerfil().getCodArea());
        	System.out.println("getUsuario().getCodigo="+filtroBusquedaVO.getUsuario().getCodigo());
        	System.out.println("getUsuario().getEncargaturaPerfil().getCodEncargatura="+filtroBusquedaVO.getUsuario().getEncargaturaPerfil().getCodEncargatura());
        	
            logger.info("SQL Lista de Expedientes = " + vSQL);
            logger.info("inicio Lista de Expedientes:" + new Date());
            rs = call.executeQuery();
            logger.info("fin Lista de Expedientes: " + new Date());
            int ind=0;
            while(rs.next()){
            	//rs del sp
            	ExpedienteSTDBean docform = new ExpedienteSTDBean();
            	docform.setIndiceExpediente(ind++);
            	docform.setCodigoExpediente(rs.getLong("codigoExpediente"));
            	docform.setCodigoEstado(rs.getString("codigoEstado"));
            	docform.setNumeroExpediente(rs.getString("numeroExpediente"));
            	docform.setAnioExpediente(rs.getInt("anioExpediente"));
            	docform.setAsuntoExpediente(rs.getString("asuntoExpediente"));
            	docform.setFechaExpediente(rs.getString("fechaExpediente"));
            	docform.setCodigoOficina(rs.getString("codigoOficina"));
            	docform.setCodigoEmpleado(rs.getInt("codigoEmpleado"));
            	docform.setCodigoUsuario(rs.getInt("codigoUsuario"));
            	docform.setNombreUsuario(rs.getString("nombreUsuario"));
            	docform.setFechaCreacion(rs.getString("fechaCreacion"));
            	docform.setFlagAnulado(rs.getString("flagAnulado"));
            	docform.setFechaAnulacion(rs.getString("fechaAnulacion"));
            	docform.setFechaReapertura(rs.getString("fechaReapertura"));
            	docform.setFechaCierre(rs.getString("fechaCierre"));
            	docform.setSiglasArea(rs.getString("siglasArea"));
            	docform.setDescripcionEstado(rs.getString("descripcionEstado"));
            	docform.setTotalDocumentos(rs.getInt("totalDocumentos"));
            	docform.setUsuario(filtroBusquedaVO.getUsuario());
            	lstExpedientes.add(docform);
            }
        }
        catch(Exception e)
        {
        	logger.error("[STD]: Error en listarExpedientes: " + e.getMessage());
            e.printStackTrace();
        }
        finally
	    {   
        	cn.destroy(conn,null,rs,call,pre);
	    }
		return lstExpedientes;
	}
}
